/**
 * @file Bsp_Bmp280.h
 * @author 徐松亮 (5387603@qq.com)
 * @version 1.0
 * @date 2023-09-27
 *
 * @copyright Copyright (c) {2030}  沈阳迈思医疗科技有限公司
 *
 * @brief 驱动层-->环境气压温度传感器BMP280驱动程序。
 * @note (仅在h文件描述注释)
 * 	@verbatim
    1.适用芯片:
        STM32H7
    2.移植步骤:无
    3.验证方法:无
    4.使用方法:无
    5.其他说明:
        应用说明:访问BMP085前，请先调用一次 bsp_InitI2C()函数配置好I2C相关的GPIO.

        BMP085 是BOSCH公司生产的的一款高精度、超低能耗的压力传感器。绝对精度最低可以达到0.03hPa。
        BMP085 通过I2C总线直接与各种微处理器相连。
        压力范围：300 ... 1100hPa（海拔9000米...-500米）
                30kPa ... 110kPa

        压强单位：
            inHg 英寸汞柱
            mmHg 毫米汞柱
            mbar 毫巴(=百帕)
            hPa 百帕
            kPa 千帕, 1kPa = 1000Pa
            MPa 兆帕, 1MPa = 1000kPa = 1000000Pa

        1百帕=1毫巴=3/4毫米水银柱
        在海平面的平均气压 约为1013.25百帕斯卡（760毫米水银柱），这个值也被称为标准大气压

        度量衡换算：
            1标准大气压=101 325帕斯卡
            1帕斯卡=9.8692326671601*10-6标准大气压

        Doc文件夹下有《全国各地主要城市海拔高度及大气压参考数据.pdf》

        城市   海拔高度(m)  气压强度(kPa)
        北京     31.2         99.86
        天津     3.3          100.48
        石家庄   80.5         99.56
        太原     777.9        91.92
        呼和浩特 1063         88.94
        沈阳     41.6         100.07
        大连     92.8         99.47
        长春     236.8        97.79
        哈尔滨   171.7        98.51
        上海     4.5          100.53
        南京     8.9          100.4
        杭州     41.7         100.05
        合肥     29.8         100.09
        福州     84           99.64
        厦门     63.2         99.91
        南昌     46.7         99.91
        济南     51.6         99.85
        武汉     23.3         100.17
        郑州     110.4        99.17
        长沙     44.9         99.94
        广州     6.6          100.45
        南宁     72.2         99.6
        重庆     259.1        97.32
        贵阳     1071.2       88.79
        昆明     1891.4       80.8
        拉萨     3658.        65.23
        西安     396.9        95.92
        兰州     1517.2       84.31
        成都     505.9        94.77
        西宁     2261.2       77.35
        银川     1111.5       88.35
        乌鲁木齐 917.9        90.67

        香港     32           100.56
        台北     9            100.53

        汕头     1.2          100.55   【最低海拔】广东省
        那曲     4507         58.9     【最高海拔】西藏自治区

        珠峰高度为海拔 8848米    相当于0.3个大气压 ,即30.39KPa  【该数据存在争议】

        【根据气压，温度计算海拔高度，只是大致关系，仅供参考】
        H = (RT/gM)*ln(p0/p)
            R为常数8.51
            T为热力学温度（常温下）（摄氏度要转化成热力学温度）
            g为重力加速度10
            M为气体的分子量29
            P0为标准大气压
            P为要求的高度的气压
            这个公式的推导过程较复杂就不推导了，自己应该会转换的。


        可以总结出近似的计算公式；
            P=100KPa   H*10kPa/km   H在0,3km之间
            P=70kPa    H*8kPa/km    H在3km,5km之间
            P=54kPa    H*6.5kPa/km   H在5km,7km之间
            P=41kPa    H*5kPa/km   H在7km,10km之间
            P=25kPa    H*3.5kPa/km   H在10km,12km之间
    @endverbatim
 * @todo (仅在h文件描述待办事项)
 * @bug 长时间运行偶尔有输出数据全为0的现象，从上电才可恢复。
 * @par 修改日志:
 * <table>
 * <tr><th>日期   <th>版本 <th>作者  <th>描述
 * <tr><td>2023-09-27 <td>1.0     <td>徐松亮     <td>创建初始版本
 * </table>
 */
/* 防止重复编译 (Define to prevent recursive inclusion)------------------------*/
#ifndef __BSP_BMP280_H
#define __BSP_BMP280_H
/* 通用头部文件 (General Includes)---------------------------------------------*/
#include "Bsp_GpioIIC.h"
#include "Module_MemManager.h"
#include "Module_Count.h"
/* 公有类型定义 (Exported types)-----------------------------------------------*/
typedef struct
{
    uint16_t us_T1;
    int16_t s_T2;
    int16_t s_T3;

    uint16_t us_P1;
    int16_t s_P2;
    int16_t s_P3;
    int16_t s_P4;
    int16_t s_P5;
    int16_t s_P6;
    int16_t s_P7;
    int16_t s_P8;
    int16_t s_P9;
} BSP_BSP280_T_CALIBRATION;

typedef struct
{
    BSP_GPIO_IIC_T_INTERFACE *tp_GpioIIC;
    void (*fnp_DebugOutStr)(int8_t *);
} BSP_BSP280_T_INPUT;
typedef struct
{
    // 统计
    uint16_t us_CommCmt_Ok;
    uint16_t us_CommCmt_Err;
    // 传感器
    int32_t l_Temp_x10;
    uint32_t ul_AirPressure;
    int16_t s_Altitude;
    uint8_t uc_State; // OK	ERR
} BSP_BSP280_T_OUTPUT;
typedef struct
{
    void (*fnp_Cycle_100ms)(void *);
} BSP_BSP280_T_TRANSPLANT;
typedef struct
{
    // 硬件相关
    uint8_t uc_DeviceAddr;
    // 过程
    uint8_t uc_step;
    uint8_t uc_Timer_100ms;
    uint8_t uc_Flag_DebugFirst : 1;
    uint8_t uc_res : 7;
    uint8_t uc_InternalVariable_ErrCmt;
    //
    uint8_t uc_DebugTestEnable;
    BSP_BSP280_T_CALIBRATION t_Calibration;
} BSP_BSP280_T_PRIVATE;
typedef struct
{
    BSP_BSP280_T_INPUT t_Input;
    BSP_BSP280_T_OUTPUT t_Output;
    BSP_BSP280_T_TRANSPLANT t_Transplant;
    BSP_BSP280_T_PRIVATE t_Private;
} BSP_BMP280_T_INTERFACE;
/* 移植性宏定义 (Transplant define)--------------------------------------------*/
/* 应用性宏定义 (Application define)-------------------------------------------*/
// 精度选择(0-3)
#define BSP_BMP280_OSS (3)
#define BSP_BMP280_ADDR (0x76 << 1)
/* 公有常量声明 (Exported constants)-------------------------------------------*/
/* 公有变量声明 (Exported variables)-------------------------------------------*/
/* 公有函数声明 (Exported functions)-------------------------------------------*/
void BspBmp280_Init(BSP_BMP280_T_INTERFACE *_tp_interface);

void BspBmp280_DebugTestOnOff(uint8_t _uc_trueOrFalse, void *_vp_context);
//------------------------------------------------------------------------------
#endif
/********************************END OF FILE***********************************/
